summary refs log tree commit diff stats
path: root/gitlab/issues_text/target_missing/host_missing/accel_missing/1148
diff options
context:
space:
mode:
Diffstat (limited to 'gitlab/issues_text/target_missing/host_missing/accel_missing/1148')
-rw-r--r--gitlab/issues_text/target_missing/host_missing/accel_missing/1148271
1 files changed, 0 insertions, 271 deletions
diff --git a/gitlab/issues_text/target_missing/host_missing/accel_missing/1148 b/gitlab/issues_text/target_missing/host_missing/accel_missing/1148
deleted file mode 100644
index 936dea8e5..000000000
--- a/gitlab/issues_text/target_missing/host_missing/accel_missing/1148
+++ /dev/null
@@ -1,271 +0,0 @@
-Support Octal SPI mode and commands for NOR SPI devices
-Additional information:
-A good example of the Octal SPI (OPI) protocol use is in https://www.st.com/resource/en/application_note/dm00407776-octospi-interface-on-stm32-microcontrollers-stmicroelectronics.pdf
-
-It is also supported by the concrete drivers in Linux kernel:
-- `drivers/mtd/spi-nor/core.c`
-- `drivers/mtd/spi-nor/micron-st.c`
-- `drivers/mtd/spi-nor/spansion.c`
-
-I tried to extract the Octal SPI part from that commit and got something like this, though obviously needs more cleaning up/improving:
-```patch
----
- hw/block/m25p80.c | 93 ++++++++++++++++++++++++++++++++++-------------
- 1 file changed, 68 insertions(+), 25 deletions(-)
-
-diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
-index 7d3d8b12e0..0aa46bf280 100644
---- a/hw/block/m25p80.c
-+++ b/hw/block/m25p80.c
-@@ -361,6 +361,8 @@ typedef enum {
-     READ4 = 0x13,
-     FAST_READ = 0x0b,
-     FAST_READ4 = 0x0c,
-+    O_FAST_READ = 0x9d,
-+    O_FAST_READ4 = 0xfc,
-     DOR = 0x3b,
-     DOR4 = 0x3c,
-     QOR = 0x6b,
-@@ -369,6 +371,11 @@ typedef enum {
-     DIOR4 = 0xbc,
-     QIOR = 0xeb,
-     QIOR4 = 0xec,
-+    OOR = 0x8b,
-+    OOR4 = 0x8c,
-+    OOR4_MT35X = 0x7c, /* according mt35x datasheet */
-+    OIOR = 0xcb,
-+    OIOR4 = 0xcc,
- 
-     PP = 0x02,
-     PP4 = 0x12,
-@@ -379,6 +386,8 @@ typedef enum {
-     RDID_90 = 0x90,
-     RDID_AB = 0xab,
-     AAI_WP = 0xad,
-+    OPP = 0x82,
-+    OPP4 = 0x84,
- 
-     ERASE_4K = 0x20,
-     ERASE4_4K = 0x21,
-@@ -422,6 +431,7 @@ typedef enum {
-     STATE_COLLECTING_DATA,
-     STATE_COLLECTING_VAR_LEN_DATA,
-     STATE_READING_DATA,
-+    DUMMY_CYCLE_WAIT,
- } CMDState;
- 
- typedef enum {
-@@ -654,12 +664,16 @@ static inline int get_addr_length(Flash *s)
-    case QPP_4:
-    case READ4:
-    case QIOR4:
-+   case OIOR4:
-    case ERASE4_4K:
-    case ERASE4_32K:
-    case ERASE4_SECTOR:
-    case FAST_READ4:
-+   case O_FAST_READ4:
-    case DOR4:
-    case QOR4:
-+   case OOR4:
-+   case OOR4_MT35X:
-    case DIOR4:
-        return 4;
-    default:
-@@ -670,6 +684,7 @@ static inline int get_addr_length(Flash *s)
- static void complete_collecting_data(Flash *s)
- {
-     int i, n;
-+    bool dummy_state = false;
- 
-     n = get_addr_length(s);
-     s->cur_addr = (n == 3 ? s->ear : 0);
-@@ -689,9 +704,12 @@ static void complete_collecting_data(Flash *s)
-     case DPP:
-     case QPP:
-     case QPP_4:
-+    case OPP:
-     case PP:
-+        s->state = STATE_PAGE_PROGRAM;
-+        break;
-+    case OPP4:
-     case PP4:
--    case PP4_4:
-         s->state = STATE_PAGE_PROGRAM;
-         break;
-     case AAI_WP:
-@@ -702,16 +720,27 @@ static void complete_collecting_data(Flash *s)
-     case READ:
-     case READ4:
-     case FAST_READ:
--    case FAST_READ4:
-+    case O_FAST_READ:
-     case DOR:
--    case DOR4:
-     case QOR:
--    case QOR4:
-+    case OOR:
-     case DIOR:
--    case DIOR4:
-     case QIOR:
-+    case OIOR:
-+    case FAST_READ4:
-+    case O_FAST_READ4:
-+    case DOR4:
-+    case QOR4:
-+    case OOR4:
-+    case OOR4_MT35X:
-+    case DIOR4:
-     case QIOR4:
--        s->state = STATE_READ;
-+    case OIOR4:
-+        if (dummy_state == false) {
-+            s->state = STATE_READ;
-+        } else {
-+            s->state = DUMMY_CYCLE_WAIT;
-+        }
-         break;
-     case ERASE_4K:
-     case ERASE4_4K:
-@@ -744,7 +773,6 @@ static void complete_collecting_data(Flash *s)
-             s->write_enable = false;
-         }
-         break;
--    case BRWR:
-     case EXTEND_ADDR_WRITE:
-         s->ear = s->data[0];
-         break;
-@@ -1038,6 +1066,7 @@ static void decode_qio_read_cmd(Flash *s)
-         s->needed_bytes += 3;
-         break;
-     default:
-+        s->needed_bytes += 5;
-         break;
-     }
-     s->pos = 0;
-@@ -1066,28 +1095,39 @@ static void decode_new_cmd(Flash *s, uint32_t value)
-                       "M25P80: Invalid cmd within AAI programming sequence");
-     }
- 
-+    s->needed_bytes = 0;
-+
-     switch (value) {
- 
-+    case ERASE4_SECTOR:
-+        if (s->four_bytes_address_mode == false) {
-+            s->needed_bytes += 1;
-+        }
-     case ERASE_4K:
--    case ERASE4_4K:
-     case ERASE_32K:
--    case ERASE4_32K:
-     case ERASE_SECTOR:
--    case ERASE4_SECTOR:
-+    case OPP:
-     case PP:
--    case PP4:
-+    case QOR:
-+    case OOR:
-+    case FAST_READ:
-+    case O_FAST_READ:
-+    case DOR:
-     case DIE_ERASE:
-     case RDID_90:
-     case RDID_AB:
--        s->needed_bytes = get_addr_length(s);
-+        s->needed_bytes += get_addr_length(s);
-         s->pos = 0;
-         s->len = 0;
-         s->state = STATE_COLLECTING_DATA;
-         break;
--    case READ:
-     case READ4:
-+        if (s->four_bytes_address_mode == false) {
-+            s->needed_bytes += 1;
-+        }
-+    case READ:
-         if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) == MODE_STD) {
--            s->needed_bytes = get_addr_length(s);
-+            s->needed_bytes += get_addr_length(s);
-             s->pos = 0;
-             s->len = 0;
-             s->state = STATE_COLLECTING_DATA;
-@@ -1098,7 +1138,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
-         break;
-     case DPP:
-         if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_QIO) {
--            s->needed_bytes = get_addr_length(s);
-+            s->needed_bytes += get_addr_length(s);
-             s->pos = 0;
-             s->len = 0;
-             s->state = STATE_COLLECTING_DATA;
-@@ -1110,8 +1150,11 @@ static void decode_new_cmd(Flash *s, uint32_t value)
-     case QPP:
-     case QPP_4:
-     case PP4_4:
-+        if (s->four_bytes_address_mode == false) {
-+            s->needed_bytes += 1;
-+        }
-         if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_DIO) {
--            s->needed_bytes = get_addr_length(s);
-+            s->needed_bytes += get_addr_length(s);
-             s->pos = 0;
-             s->len = 0;
-             s->state = STATE_COLLECTING_DATA;
-@@ -1121,11 +1164,9 @@ static void decode_new_cmd(Flash *s, uint32_t value)
-         }
-         break;
- 
--    case FAST_READ:
-     case FAST_READ4:
-         decode_fast_read_cmd(s);
-         break;
--    case DOR:
-     case DOR4:
-         if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_QIO) {
-             decode_fast_read_cmd(s);
-@@ -1134,14 +1175,13 @@ static void decode_new_cmd(Flash *s, uint32_t value)
-                           "QIO mode\n", s->cmd_in_progress);
-         }
-         break;
--    case QOR:
-     case QOR4:
--        if (get_man(s) != MAN_NUMONYX || numonyx_mode(s) != MODE_DIO) {
--            decode_fast_read_cmd(s);
--        } else {
--            qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Cannot execute cmd %x in "
--                          "DIO mode\n", s->cmd_in_progress);
--        }
-+    case OOR4:
-+    case OOR4_MT35X:
-+        s->needed_bytes += 4;
-+        s->pos = 0;
-+        s->len = 0;
-+        s->state = STATE_COLLECTING_DATA;
-         break;
- 
-     case DIOR:
-@@ -1265,6 +1305,7 @@ static void decode_new_cmd(Flash *s, uint32_t value)
-         s->four_bytes_address_mode = false;
-         break;
-     case BRRD:
-+        s->data_read_loop = false;
-     case EXTEND_ADDR_READ:
-         s->data[0] = s->ear;
-         s->pos = 0;
-@@ -1475,6 +1516,8 @@ static uint32_t m25p80_transfer8(SSIPeripheral *ss, uint32_t tx)
-         }
-         break;
- 
-+    case DUMMY_CYCLE_WAIT:
-+        break;
-     default:
-     case STATE_IDLE:
-         decode_new_cmd(s, (uint8_t)tx);
--- 
-```
-There is also missing **0xfd** command for the DDR Octal I/O Fast Read for Micron MT35X chips. I am not sure if it's the same as the **0xfc** command in the Xilinx code though.
-
-Since I am not the author of the original commit, maybe Xilinx folks could take my patch, update/improve it and send to the mailing list. It will reduce the amount of the changes you have to apply in your fork as well :smile:
-
-cc @alistair23