xilinx_spips: Update striping to be big-endian bit order
Update striping functionality to be big-endian bit order (as according to the Zynq-7000 Technical Reference Manual). Output thereafter the even bits into the flash memory connected to the lower QSPI bus and the odd bits into the flash memory connected to the upper QSPI bus. Signed-off-by: Francisco Iglesias <frasse.iglesias@gmail.com> Acked-by: Alistair Francis <alistair.francis@xilinx.com> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Tested-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Message-id: 20171126231634.9531-7-frasse.iglesias@gmail.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
				
					committed by
					
						
						Peter Maydell
					
				
			
			
				
	
			
			
			
						parent
						
							5394dbcca8
						
					
				
				
					commit
					c3725b8549
				
			@@ -208,14 +208,14 @@ static void xilinx_spips_reset(DeviceState *d)
 | 
			
		||||
    xilinx_spips_update_cs_lines(s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* N way (num) in place bit striper. Lay out row wise bits (LSB to MSB)
 | 
			
		||||
/* N way (num) in place bit striper. Lay out row wise bits (MSB to LSB)
 | 
			
		||||
 * column wise (from element 0 to N-1). num is the length of x, and dir
 | 
			
		||||
 * reverses the direction of the transform. Best illustrated by example:
 | 
			
		||||
 * Each digit in the below array is a single bit (num == 3):
 | 
			
		||||
 *
 | 
			
		||||
 * {{ 76543210, }  ----- stripe (dir == false) -----> {{ FCheb630, }
 | 
			
		||||
 *  { hgfedcba, }                                      { GDAfc741, }
 | 
			
		||||
 *  { HGFEDCBA, }} <---- upstripe (dir == true) -----  { HEBgda52, }}
 | 
			
		||||
 * {{ 76543210, }  ----- stripe (dir == false) -----> {{ 741gdaFC, }
 | 
			
		||||
 *  { hgfedcba, }                                      { 630fcHEB, }
 | 
			
		||||
 *  { HGFEDCBA, }} <---- upstripe (dir == true) -----  { 52hebGDA, }}
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static inline void stripe8(uint8_t *x, int num, bool dir)
 | 
			
		||||
@@ -223,15 +223,15 @@ static inline void stripe8(uint8_t *x, int num, bool dir)
 | 
			
		||||
    uint8_t r[num];
 | 
			
		||||
    memset(r, 0, sizeof(uint8_t) * num);
 | 
			
		||||
    int idx[2] = {0, 0};
 | 
			
		||||
    int bit[2] = {0, 0};
 | 
			
		||||
    int bit[2] = {0, 7};
 | 
			
		||||
    int d = dir;
 | 
			
		||||
 | 
			
		||||
    for (idx[0] = 0; idx[0] < num; ++idx[0]) {
 | 
			
		||||
        for (bit[0] = 0; bit[0] < 8; ++bit[0]) {
 | 
			
		||||
            r[idx[d]] |= x[idx[!d]] & 1 << bit[!d] ? 1 << bit[d] : 0;
 | 
			
		||||
        for (bit[0] = 7; bit[0] >= 0; bit[0]--) {
 | 
			
		||||
            r[idx[!d]] |= x[idx[d]] & 1 << bit[d] ? 1 << bit[!d] : 0;
 | 
			
		||||
            idx[1] = (idx[1] + 1) % num;
 | 
			
		||||
            if (!idx[1]) {
 | 
			
		||||
                bit[1]++;
 | 
			
		||||
                bit[1]--;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -266,8 +266,9 @@ static void xilinx_spips_flush_txfifo(XilinxSPIPS *s)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (i = 0; i < num_effective_busses(s); ++i) {
 | 
			
		||||
            int bus = num_effective_busses(s) - 1 - i;
 | 
			
		||||
            DB_PRINT_L(debug_level, "tx = %02x\n", tx_rx[i]);
 | 
			
		||||
            tx_rx[i] = ssi_transfer(s->spi[i], (uint32_t)tx_rx[i]);
 | 
			
		||||
            tx_rx[i] = ssi_transfer(s->spi[bus], (uint32_t)tx_rx[i]);
 | 
			
		||||
            DB_PRINT_L(debug_level, "rx = %02x\n", tx_rx[i]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user