Loading src/drivers/ata/ahci_elphel.c +5 −6 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,10 @@ #define PROP_NAME_CLB_OFFS "clb_offs" #define PROP_NAME_CLB_OFFS "clb_offs" #define PROP_NAME_FB_OFFS "fb_offs" #define PROP_NAME_FB_OFFS "fb_offs" bool crash_drv = false; module_param(crash_drv, bool, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(sh_drv, "Set or reset crash driver flag"); static struct ata_port_operations ahci_elphel_ops; static struct ata_port_operations ahci_elphel_ops; static const struct ata_port_info ahci_elphel_port_info; static const struct ata_port_info ahci_elphel_port_info; static struct scsi_host_template ahci_platform_sht; static struct scsi_host_template ahci_platform_sht; Loading @@ -55,6 +59,7 @@ static int elphel_port_start(struct ata_port *ap) const struct elphel_ahci_priv *dpriv = hpriv->plat_data; const struct elphel_ahci_priv *dpriv = hpriv->plat_data; libahci_debug_init(ap->host); libahci_debug_init(ap->host); libahci_debug_crash_set(crash_drv); dev_dbg(dev, "starting port %d", ap->port_no); dev_dbg(dev, "starting port %d", ap->port_no); #ifdef DEBUG_EVENT_ELPHEL #ifdef DEBUG_EVENT_ELPHEL Loading Loading @@ -234,12 +239,6 @@ static void elphel_qc_prep(struct ata_queued_cmd *qc) ahci_sg[n_elem].addr_hi = cpu_to_le32((addr >> 16) >> 16); ahci_sg[n_elem].addr_hi = cpu_to_le32((addr >> 16) >> 16); ahci_sg[n_elem].flags_size = cpu_to_le32(sg_len - 1); ahci_sg[n_elem].flags_size = cpu_to_le32(sg_len - 1); } } if (qc->dma_dir == DMA_TO_DEVICE) { dma_sync_sg_for_device(&qc->dev->tdev, qc->sg, qc->n_elem, qc->dma_dir); } else if (qc->dma_dir == DMA_FROM_DEVICE) { dma_sync_sg_for_cpu(&qc->dev->tdev, qc->sg, qc->n_elem, qc->dma_dir); } } } /* /* Loading src/drivers/ata/libahci.c +2 −2 Original line number Original line Diff line number Diff line Loading @@ -2058,7 +2058,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc) */ */ // Elphel; Need to wrap with dma_sync_single_for_cpu / dma_sync_single_for_device, move to in ahci_elphel.c // Elphel; Need to wrap with dma_sync_single_for_cpu / dma_sync_single_for_device, move to in ahci_elphel.c dma_sync_single_for_cpu(qc->dev, pp->cmd_tbl_dma, AHCI_CMD_TBL_AR_SZ, DMA_TO_DEVICE); dma_sync_single_for_cpu(&qc->dev->tdev, pp->cmd_tbl_dma, AHCI_CMD_TBL_AR_SZ, DMA_TO_DEVICE); cmd_tbl = pp->cmd_tbl + qc->tag * AHCI_CMD_TBL_SZ; cmd_tbl = pp->cmd_tbl + qc->tag * AHCI_CMD_TBL_SZ; ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, cmd_tbl); ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, cmd_tbl); Loading Loading @@ -2097,7 +2097,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc) //ahci_fill_cmd_slot(pp, tag, opts); //ahci_fill_cmd_slot(pp, tag, opts); // Elphel move to ahci_elphel.c. See if the SG dma should also be handed to dma here // Elphel move to ahci_elphel.c. See if the SG dma should also be handed to dma here dma_sync_single_for_device(qc->dev, pp->cmd_tbl_dma, AHCI_CMD_TBL_AR_SZ, DMA_TO_DEVICE); dma_sync_single_for_device(&qc->dev->tdev, pp->cmd_tbl_dma, AHCI_CMD_TBL_AR_SZ, DMA_TO_DEVICE); WARN_ON (qc->tag); WARN_ON (qc->tag); } } Loading src/drivers/ata/libahci_debug.c +39 −1 Original line number Original line Diff line number Diff line Loading @@ -13,9 +13,9 @@ #include <asm/outercache.h> #include <asm/outercache.h> #include <asm/cacheflush.h> #include <asm/cacheflush.h> #include <elphel/elphel393-mem.h> #include <elphel/elphel393-mem.h> #include <linux/jiffies.h> #include "libahci_debug.h" #include "libahci_debug.h" #include <asm/io.h> // ioremap(), copy_fromio #include <asm/io.h> // ioremap(), copy_fromio #include <linux/jiffies.h> /* /* struct elphel_buf_t struct elphel_buf_t { { Loading @@ -31,6 +31,7 @@ static struct dentry *debug_root = NULL; static struct libahci_debug_list debug_list = {.debug = 0}; static struct libahci_debug_list debug_list = {.debug = 0}; static struct ahci_cmd cmd; static struct ahci_cmd cmd; static bool load_flag = false; static bool load_flag = false; static bool error_flag = false; const size_t maxigp1_start = 0x80000000; // start of MAXIGP1 physical address range const size_t maxigp1_start = 0x80000000; // start of MAXIGP1 physical address range const size_t maxigp1_size = 0x3000; // size of register memory to save const size_t maxigp1_size = 0x3000; // size of register memory to save const size_t buffer_offset = 0x40000; // start of dumping area (0xxxx, 1xxxx and 2xxxx are used for dma buffers const size_t buffer_offset = 0x40000; // start of dumping area (0xxxx, 1xxxx and 2xxxx are used for dma buffers Loading Loading @@ -692,6 +693,36 @@ static ssize_t libahci_debug_load(struct file *f, const char __user *buff, size_ return buff_sz; return buff_sz; } } static ssize_t libahci_debug_crash_write(struct file *f, const char __user *buff, size_t buff_sz, loff_t *ppos) { if (buff[0] == '1') { error_flag = true; } else { error_flag = false; } return buff_sz; } static ssize_t libahci_debug_crash_read(struct file *f, char __user *buff, size_t buff_sz, loff_t *ppos) { char *tmp = error_flag ? "1" : "0"; copy_to_user(buff, tmp, 2); return 2; } void libahci_debug_crash_here(void) { BUG_ON(error_flag == true); } EXPORT_SYMBOL_GPL(libahci_debug_crash_here); void libahci_debug_crash_set(bool val) { error_flag = (val == 0) ? false : true; } EXPORT_SYMBOL_GPL(libahci_debug_crash_set); /* /* * This function waits until the loading flag is set through debugfs file. * This function waits until the loading flag is set through debugfs file. * The state of the flag is checked every 100ms. * The state of the flag is checked every 100ms. Loading Loading @@ -881,6 +912,11 @@ static const struct file_operations libahci_debug_load_ops= { .write = libahci_debug_load, .write = libahci_debug_load, }; }; static const struct file_operations libahci_debug_error_ops= { .write = libahci_debug_crash_write, .read = libahci_debug_crash_read, }; static int libahci_debug_init_sg(void) static int libahci_debug_init_sg(void) { { cmd.sg_buff = kzalloc(CMD_DMA_BUFSZ, GFP_KERNEL); cmd.sg_buff = kzalloc(CMD_DMA_BUFSZ, GFP_KERNEL); Loading Loading @@ -922,6 +958,8 @@ int libahci_debug_init(struct ata_host *host) debug_root, host, &libahci_debug_host_ops); debug_root, host, &libahci_debug_host_ops); debugfs_create_file("loading", 0222, debugfs_create_file("loading", 0222, debug_root, host, &libahci_debug_load_ops); debug_root, host, &libahci_debug_load_ops); debugfs_create_file("crash_on_error", 0644, debug_root, host, &libahci_debug_error_ops); /* Create subdir for each port and add there several files: /* Create subdir for each port and add there several files: * one for port registers, one for port events log and * one for port registers, one for port events log and Loading src/drivers/ata/libahci_debug.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -130,5 +130,8 @@ void libahci_debug_exec_cmd(struct ata_port *ap); void libahci_debug_wait_flag(void); void libahci_debug_wait_flag(void); unsigned int libahci_debug_state_dump(struct ata_port *ap); unsigned int libahci_debug_state_dump(struct ata_port *ap); unsigned int libahci_debug_saxigp1_save(struct ata_port *ap, size_t dump_size); unsigned int libahci_debug_saxigp1_save(struct ata_port *ap, size_t dump_size); void libahci_debug_crash_here(void); void libahci_debug_crash_set(bool val); void libahci_debug_timestamp(cycles_t start_c, cycles_t end_c, unsigned long start_j, unsigned long end_j, u32 id); #endif /* _LIBAHCI_DEBUG_H_ */ #endif /* _LIBAHCI_DEBUG_H_ */ src/drivers/ata/libata-core.c +1 −9 Original line number Original line Diff line number Diff line Loading @@ -1564,6 +1564,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev, unsigned long flags; unsigned long flags; unsigned int err_mask; unsigned int err_mask; int rc; int rc; dev_dbg(ap->host->dev, "libata-core.c:ata_exec_internal_sg() ap->pflags = 0x%x, link->eh_info.action=0x%08x\n",ap->pflags,link->eh_info.action); dev_dbg(ap->host->dev, "libata-core.c:ata_exec_internal_sg() ap->pflags = 0x%x, link->eh_info.action=0x%08x\n",ap->pflags,link->eh_info.action); spin_lock_irqsave(ap->lock, flags); spin_lock_irqsave(ap->lock, flags); Loading Loading @@ -4894,15 +4895,6 @@ void ata_qc_complete(struct ata_queued_cmd *qc) * taken care of. * taken care of. */ */ dev_dbg(&qc->dev->tdev, "%s: qc->dma_dir: %d", __func__, qc->dma_dir); if (qc->dma_dir == DMA_TO_DEVICE) { dev_dbg(&qc->dev->tdev, "%s: dma_sync_sg_for_device, qc->dma_dir: %d", __func__, qc->dma_dir); dma_sync_sg_for_device(&qc->dev->tdev, qc->sg, qc->n_elem, qc->dma_dir); } else if (qc->dma_dir == DMA_FROM_DEVICE) { dev_dbg(&qc->dev->tdev, "%s: dma_sync_sg_for_cpu, qc->dma_dir: %d", __func__, qc->dma_dir); dma_sync_sg_for_cpu(&qc->dev->tdev, qc->sg, qc->n_elem, qc->dma_dir); } if (ap->ops->error_handler) { if (ap->ops->error_handler) { struct ata_device *dev = qc->dev; struct ata_device *dev = qc->dev; struct ata_eh_info *ehi = &dev->link->eh_info; struct ata_eh_info *ehi = &dev->link->eh_info; Loading Loading
src/drivers/ata/ahci_elphel.c +5 −6 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,10 @@ #define PROP_NAME_CLB_OFFS "clb_offs" #define PROP_NAME_CLB_OFFS "clb_offs" #define PROP_NAME_FB_OFFS "fb_offs" #define PROP_NAME_FB_OFFS "fb_offs" bool crash_drv = false; module_param(crash_drv, bool, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(sh_drv, "Set or reset crash driver flag"); static struct ata_port_operations ahci_elphel_ops; static struct ata_port_operations ahci_elphel_ops; static const struct ata_port_info ahci_elphel_port_info; static const struct ata_port_info ahci_elphel_port_info; static struct scsi_host_template ahci_platform_sht; static struct scsi_host_template ahci_platform_sht; Loading @@ -55,6 +59,7 @@ static int elphel_port_start(struct ata_port *ap) const struct elphel_ahci_priv *dpriv = hpriv->plat_data; const struct elphel_ahci_priv *dpriv = hpriv->plat_data; libahci_debug_init(ap->host); libahci_debug_init(ap->host); libahci_debug_crash_set(crash_drv); dev_dbg(dev, "starting port %d", ap->port_no); dev_dbg(dev, "starting port %d", ap->port_no); #ifdef DEBUG_EVENT_ELPHEL #ifdef DEBUG_EVENT_ELPHEL Loading Loading @@ -234,12 +239,6 @@ static void elphel_qc_prep(struct ata_queued_cmd *qc) ahci_sg[n_elem].addr_hi = cpu_to_le32((addr >> 16) >> 16); ahci_sg[n_elem].addr_hi = cpu_to_le32((addr >> 16) >> 16); ahci_sg[n_elem].flags_size = cpu_to_le32(sg_len - 1); ahci_sg[n_elem].flags_size = cpu_to_le32(sg_len - 1); } } if (qc->dma_dir == DMA_TO_DEVICE) { dma_sync_sg_for_device(&qc->dev->tdev, qc->sg, qc->n_elem, qc->dma_dir); } else if (qc->dma_dir == DMA_FROM_DEVICE) { dma_sync_sg_for_cpu(&qc->dev->tdev, qc->sg, qc->n_elem, qc->dma_dir); } } } /* /* Loading
src/drivers/ata/libahci.c +2 −2 Original line number Original line Diff line number Diff line Loading @@ -2058,7 +2058,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc) */ */ // Elphel; Need to wrap with dma_sync_single_for_cpu / dma_sync_single_for_device, move to in ahci_elphel.c // Elphel; Need to wrap with dma_sync_single_for_cpu / dma_sync_single_for_device, move to in ahci_elphel.c dma_sync_single_for_cpu(qc->dev, pp->cmd_tbl_dma, AHCI_CMD_TBL_AR_SZ, DMA_TO_DEVICE); dma_sync_single_for_cpu(&qc->dev->tdev, pp->cmd_tbl_dma, AHCI_CMD_TBL_AR_SZ, DMA_TO_DEVICE); cmd_tbl = pp->cmd_tbl + qc->tag * AHCI_CMD_TBL_SZ; cmd_tbl = pp->cmd_tbl + qc->tag * AHCI_CMD_TBL_SZ; ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, cmd_tbl); ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, cmd_tbl); Loading Loading @@ -2097,7 +2097,7 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc) //ahci_fill_cmd_slot(pp, tag, opts); //ahci_fill_cmd_slot(pp, tag, opts); // Elphel move to ahci_elphel.c. See if the SG dma should also be handed to dma here // Elphel move to ahci_elphel.c. See if the SG dma should also be handed to dma here dma_sync_single_for_device(qc->dev, pp->cmd_tbl_dma, AHCI_CMD_TBL_AR_SZ, DMA_TO_DEVICE); dma_sync_single_for_device(&qc->dev->tdev, pp->cmd_tbl_dma, AHCI_CMD_TBL_AR_SZ, DMA_TO_DEVICE); WARN_ON (qc->tag); WARN_ON (qc->tag); } } Loading
src/drivers/ata/libahci_debug.c +39 −1 Original line number Original line Diff line number Diff line Loading @@ -13,9 +13,9 @@ #include <asm/outercache.h> #include <asm/outercache.h> #include <asm/cacheflush.h> #include <asm/cacheflush.h> #include <elphel/elphel393-mem.h> #include <elphel/elphel393-mem.h> #include <linux/jiffies.h> #include "libahci_debug.h" #include "libahci_debug.h" #include <asm/io.h> // ioremap(), copy_fromio #include <asm/io.h> // ioremap(), copy_fromio #include <linux/jiffies.h> /* /* struct elphel_buf_t struct elphel_buf_t { { Loading @@ -31,6 +31,7 @@ static struct dentry *debug_root = NULL; static struct libahci_debug_list debug_list = {.debug = 0}; static struct libahci_debug_list debug_list = {.debug = 0}; static struct ahci_cmd cmd; static struct ahci_cmd cmd; static bool load_flag = false; static bool load_flag = false; static bool error_flag = false; const size_t maxigp1_start = 0x80000000; // start of MAXIGP1 physical address range const size_t maxigp1_start = 0x80000000; // start of MAXIGP1 physical address range const size_t maxigp1_size = 0x3000; // size of register memory to save const size_t maxigp1_size = 0x3000; // size of register memory to save const size_t buffer_offset = 0x40000; // start of dumping area (0xxxx, 1xxxx and 2xxxx are used for dma buffers const size_t buffer_offset = 0x40000; // start of dumping area (0xxxx, 1xxxx and 2xxxx are used for dma buffers Loading Loading @@ -692,6 +693,36 @@ static ssize_t libahci_debug_load(struct file *f, const char __user *buff, size_ return buff_sz; return buff_sz; } } static ssize_t libahci_debug_crash_write(struct file *f, const char __user *buff, size_t buff_sz, loff_t *ppos) { if (buff[0] == '1') { error_flag = true; } else { error_flag = false; } return buff_sz; } static ssize_t libahci_debug_crash_read(struct file *f, char __user *buff, size_t buff_sz, loff_t *ppos) { char *tmp = error_flag ? "1" : "0"; copy_to_user(buff, tmp, 2); return 2; } void libahci_debug_crash_here(void) { BUG_ON(error_flag == true); } EXPORT_SYMBOL_GPL(libahci_debug_crash_here); void libahci_debug_crash_set(bool val) { error_flag = (val == 0) ? false : true; } EXPORT_SYMBOL_GPL(libahci_debug_crash_set); /* /* * This function waits until the loading flag is set through debugfs file. * This function waits until the loading flag is set through debugfs file. * The state of the flag is checked every 100ms. * The state of the flag is checked every 100ms. Loading Loading @@ -881,6 +912,11 @@ static const struct file_operations libahci_debug_load_ops= { .write = libahci_debug_load, .write = libahci_debug_load, }; }; static const struct file_operations libahci_debug_error_ops= { .write = libahci_debug_crash_write, .read = libahci_debug_crash_read, }; static int libahci_debug_init_sg(void) static int libahci_debug_init_sg(void) { { cmd.sg_buff = kzalloc(CMD_DMA_BUFSZ, GFP_KERNEL); cmd.sg_buff = kzalloc(CMD_DMA_BUFSZ, GFP_KERNEL); Loading Loading @@ -922,6 +958,8 @@ int libahci_debug_init(struct ata_host *host) debug_root, host, &libahci_debug_host_ops); debug_root, host, &libahci_debug_host_ops); debugfs_create_file("loading", 0222, debugfs_create_file("loading", 0222, debug_root, host, &libahci_debug_load_ops); debug_root, host, &libahci_debug_load_ops); debugfs_create_file("crash_on_error", 0644, debug_root, host, &libahci_debug_error_ops); /* Create subdir for each port and add there several files: /* Create subdir for each port and add there several files: * one for port registers, one for port events log and * one for port registers, one for port events log and Loading
src/drivers/ata/libahci_debug.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -130,5 +130,8 @@ void libahci_debug_exec_cmd(struct ata_port *ap); void libahci_debug_wait_flag(void); void libahci_debug_wait_flag(void); unsigned int libahci_debug_state_dump(struct ata_port *ap); unsigned int libahci_debug_state_dump(struct ata_port *ap); unsigned int libahci_debug_saxigp1_save(struct ata_port *ap, size_t dump_size); unsigned int libahci_debug_saxigp1_save(struct ata_port *ap, size_t dump_size); void libahci_debug_crash_here(void); void libahci_debug_crash_set(bool val); void libahci_debug_timestamp(cycles_t start_c, cycles_t end_c, unsigned long start_j, unsigned long end_j, u32 id); #endif /* _LIBAHCI_DEBUG_H_ */ #endif /* _LIBAHCI_DEBUG_H_ */
src/drivers/ata/libata-core.c +1 −9 Original line number Original line Diff line number Diff line Loading @@ -1564,6 +1564,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev, unsigned long flags; unsigned long flags; unsigned int err_mask; unsigned int err_mask; int rc; int rc; dev_dbg(ap->host->dev, "libata-core.c:ata_exec_internal_sg() ap->pflags = 0x%x, link->eh_info.action=0x%08x\n",ap->pflags,link->eh_info.action); dev_dbg(ap->host->dev, "libata-core.c:ata_exec_internal_sg() ap->pflags = 0x%x, link->eh_info.action=0x%08x\n",ap->pflags,link->eh_info.action); spin_lock_irqsave(ap->lock, flags); spin_lock_irqsave(ap->lock, flags); Loading Loading @@ -4894,15 +4895,6 @@ void ata_qc_complete(struct ata_queued_cmd *qc) * taken care of. * taken care of. */ */ dev_dbg(&qc->dev->tdev, "%s: qc->dma_dir: %d", __func__, qc->dma_dir); if (qc->dma_dir == DMA_TO_DEVICE) { dev_dbg(&qc->dev->tdev, "%s: dma_sync_sg_for_device, qc->dma_dir: %d", __func__, qc->dma_dir); dma_sync_sg_for_device(&qc->dev->tdev, qc->sg, qc->n_elem, qc->dma_dir); } else if (qc->dma_dir == DMA_FROM_DEVICE) { dev_dbg(&qc->dev->tdev, "%s: dma_sync_sg_for_cpu, qc->dma_dir: %d", __func__, qc->dma_dir); dma_sync_sg_for_cpu(&qc->dev->tdev, qc->sg, qc->n_elem, qc->dma_dir); } if (ap->ops->error_handler) { if (ap->ops->error_handler) { struct ata_device *dev = qc->dev; struct ata_device *dev = qc->dev; struct ata_eh_info *ehi = &dev->link->eh_info; struct ata_eh_info *ehi = &dev->link->eh_info; Loading