Example #1
0
int sata_remove(int devnum)
{
#ifdef CONFIG_AHCI
	struct udevice *dev;
	int rc;

	rc = uclass_find_device(UCLASS_AHCI, devnum, &dev);
	if (!rc && !dev)
		rc = uclass_find_first_device(UCLASS_AHCI, &dev);
	if (rc || !dev) {
		printf("Cannot find SATA device %d (err=%d)\n", devnum, rc);
		return CMD_RET_FAILURE;
	}

	rc = device_remove(dev, DM_REMOVE_NORMAL);
	if (rc) {
		printf("Cannot remove SATA device '%s' (err=%d)\n", dev->name,
		       rc);
		return CMD_RET_FAILURE;
	}

	return 0;
#else
	return sata_stop();
#endif
}
Example #2
0
void arch_preboot_os(void)
{
#if defined(CONFIG_CMD_SATA)
	sata_stop();
#endif
#if defined(CONFIG_VIDEO_IPUV3)
	/* disable video before launching O/S */
	ipuv3_fb_shutdown();
#endif
}
Example #3
0
void arch_preboot_os(void)
{
#if defined(CONFIG_CMD_SATA)
	sata_stop();
#if defined(CONFIG_MX6)
	disable_sata_clock();
#endif
#endif
#if defined(CONFIG_VIDEO_IPUV3)
	/* disable video before launching O/S */
	ipuv3_fb_shutdown();
#endif
#if defined(CONFIG_VIDEO_MXS)
	lcdif_power_down();
#endif
}
Example #4
0
static int do_sata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
    int rc = 0;

    if (argc == 2 && strcmp(argv[1], "stop") == 0)
        return sata_stop();

    if (argc == 2 && strcmp(argv[1], "init") == 0)
    {
        if (dev_curr != -1)
            sata_stop();

        return dev_initialize();
//		return sata_initialize();
    }

    /* If the user has not yet run `sata init`, do it now */
    if (dev_curr == -1)
        if (dev_initialize())
            return 1;

    switch (argc)
    {
        case 0:
        case 1:
            return CMD_RET_USAGE;
        case 2:
            if (strncmp(argv[1],"inf", 3) == 0)
            {
                int i;
                puts('\n');
                for (i = 0; i < CONFIG_SYS_MAX_DEVICE; ++i)
                {
                    if (dev_desc[i].type == DEV_TYPE_UNKNOWN)
                        continue;
                    printf ("SATA device %d: ", i);
                    dev_print(&dev_desc[i]);
                }
                return 0;
            }
            else if (strncmp(argv[1],"dev", 3) == 0)
            {
                if ((dev_curr < 0) || (dev_curr >= CONFIG_SYS_MAX_DEVICE))
                {
                    puts("\nno SATA devices available\n");
                    return 1;
                }
                printf("\nSATA device %d: ", dev_curr);
                dev_print(&dev_desc[dev_curr]);
                return 0;
            }
            else if (strncmp(argv[1],"part",4) == 0)
            {
                int dev, ok;

                for (ok = 0, dev = 0; dev < CONFIG_SYS_MAX_DEVICE; ++dev)
                {
                    if (dev_desc[dev].part_type != PART_TYPE_UNKNOWN)
                    {
                            ++ok;
                            if (dev)
                                puts ('\n');
                            print_part(&dev_desc[dev]);
                    }
                }
                if (!ok)
                {
                    puts("\nno SATA devices available\n");
                    rc ++;
                }
                return rc;
            }
            return CMD_RET_USAGE;
        case 3:
            if (strncmp(argv[1], "dev", 3) == 0)
            {
                int dev = (int)strtoul(argv[2], NULL, 10);

                printf("\nSATA device %d: ", dev);
                if (dev >= CONFIG_SYS_MAX_DEVICE)
                {
                    puts ("unknown device\n");
                    return 1;
                }
                dev_print(&dev_desc[dev]);

                if (dev_desc[dev].type == DEV_TYPE_UNKNOWN)
                    return 1;

                dev_curr = dev;

                puts("... is now current device\n");

                return 0;
            }
            else if (strncmp(argv[1], "part", 4) == 0)
            {
                int dev = (int)strtoul(argv[2], NULL, 10);

                if (dev_desc[dev].part_type != PART_TYPE_UNKNOWN)
                {
                    print_part(&dev_desc[dev]);
                }
                else
                {
                    printf("\nSATA device %d not available\n", dev);
                    rc = 1;
                }
                return rc;
            }
            return CMD_RET_USAGE;

        default: /* at least 4 args */
            if (strcmp(argv[1], "read") == 0)
            {
                    ulong addr = strtoull(argv[2], NULL, 16);
                    ulong cnt = strtoull(argv[4], NULL, 16);
                    ulong n;
                    lbaint_t blk = strtoull(argv[3], NULL, 16);

                    printf("\nSATA read: device %d block # %ld, count %ld ... ", dev_curr, blk, cnt);

//                    n = sata_read(dev_curr, blk, cnt, (uint32_t *)addr);

                    /* flush cache after read */
//                    flush_cache(addr, cnt * dev_desc[dev_curr].blksz);

                    printf("%ld blocks read: %s\n",
                            n, (n==cnt) ? "OK" : "ERROR");
                    return (n == cnt) ? 0 : 1;
            }
            else if (strcmp(argv[1], "write") == 0)
            {
                ulong addr = strtoull(argv[2], NULL, 16);
                ulong cnt = strtoull(argv[4], NULL, 16);
                ulong n;

                lbaint_t blk = strtoull(argv[3], NULL, 16);

                printf("\nSATA write: device %d block # %ld, count %ld ... ", dev_curr, blk, cnt);

                n = dev_bwrite(dev_curr, blk, cnt, (uint32_t *)addr);

                printf("%ld blocks written: %s\n",
                        n, (n == cnt) ? "OK" : "ERROR");
                return (n == cnt) ? 0 : 1;
            }
            else
            {
                return CMD_RET_USAGE;
            }

            return rc;
    }
}