[PATCH 11/11] staging: fsl-mc: convert mc command build/parse to use C structs

2016-06-22 Thread Stuart Yoder
From: Ioana Radulescu 

The layer abstracting the building of commands and extracting
responses is currently based on macros that shift and mask the command
fields and requires exposing offset/size values as macro parameters
and makes the code harder to read.

For clarity and maintainability, instead use an implementation based on
mapping the MC command definitions to C structures. These structures
contain the hardware command fields (which are naturally-aligned)
and individual fields are little-endian ordering (the byte ordering
of the hardware).

As such, there is no need to perform the conversion between core and
hardware (LE) endianness in mc_send_command(), but instead each
individual field in a command will be converted separately if needed
by the function building the command or extracting the response.

This patch does not introduce functional changes, both the hardware
ABIs and the APIs exposed for the DPAA2 objects remain the same.

Signed-off-by: Ioana Radulescu 
Signed-off-by: Stuart Yoder 
---
 drivers/staging/fsl-mc/bus/dpbp.c | 132 --
 drivers/staging/fsl-mc/bus/dpmcp-cmd.h|  86 +++-
 drivers/staging/fsl-mc/bus/dpmcp.c|  89 ++--
 drivers/staging/fsl-mc/bus/dpmng-cmd.h|  12 +-
 drivers/staging/fsl-mc/bus/dpmng.c|  14 +-
 drivers/staging/fsl-mc/bus/dprc-cmd.h | 379 +++-
 drivers/staging/fsl-mc/bus/dprc.c | 715 ++
 drivers/staging/fsl-mc/bus/mc-sys.c   |  46 +-
 drivers/staging/fsl-mc/include/dpbp-cmd.h | 125 +-
 drivers/staging/fsl-mc/include/mc-cmd.h   |  91 ++--
 10 files changed, 1056 insertions(+), 633 deletions(-)

diff --git a/drivers/staging/fsl-mc/bus/dpbp.c 
b/drivers/staging/fsl-mc/bus/dpbp.c
index c31fe1b..fe271fb 100644
--- a/drivers/staging/fsl-mc/bus/dpbp.c
+++ b/drivers/staging/fsl-mc/bus/dpbp.c
@@ -1,4 +1,4 @@
-/* Copyright 2013-2014 Freescale Semiconductor Inc.
+/* Copyright 2013-2016 Freescale Semiconductor Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
@@ -57,12 +57,14 @@ int dpbp_open(struct fsl_mc_io *mc_io,
  u16 *token)
 {
struct mc_command cmd = { 0 };
+   struct dpbp_cmd_open *cmd_params;
int err;
 
/* prepare command */
cmd.header = mc_encode_cmd_header(DPBP_CMDID_OPEN,
  cmd_flags, 0);
-   cmd.params[0] |= mc_enc(0, 32, dpbp_id);
+   cmd_params = (struct dpbp_cmd_open *)cmd.params;
+   cmd_params->dpbp_id = cpu_to_le32(dpbp_id);
 
/* send command to mc*/
err = mc_send_command(mc_io, );
@@ -70,7 +72,7 @@ int dpbp_open(struct fsl_mc_io *mc_io,
return err;
 
/* retrieve response parameters */
-   *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+   *token = mc_cmd_hdr_read_token();
 
return err;
 }
@@ -143,7 +145,7 @@ int dpbp_create(struct fsl_mc_io *mc_io,
return err;
 
/* retrieve response parameters */
-   *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+   *token = mc_cmd_hdr_read_token();
 
return 0;
 }
@@ -231,6 +233,7 @@ int dpbp_is_enabled(struct fsl_mc_io *mc_io,
int *en)
 {
struct mc_command cmd = { 0 };
+   struct dpbp_rsp_is_enabled *rsp_params;
int err;
/* prepare command */
cmd.header = mc_encode_cmd_header(DPBP_CMDID_IS_ENABLED, cmd_flags,
@@ -242,7 +245,8 @@ int dpbp_is_enabled(struct fsl_mc_io *mc_io,
return err;
 
/* retrieve response parameters */
-   *en = (int)mc_dec(cmd.params[0], 0, 1);
+   rsp_params = (struct dpbp_rsp_is_enabled *)cmd.params;
+   *en = rsp_params->enabled & DPBP_ENABLE;
 
return 0;
 }
@@ -286,14 +290,16 @@ int dpbp_set_irq(struct fsl_mc_io *mc_io,
 struct dpbp_irq_cfg *irq_cfg)
 {
struct mc_command cmd = { 0 };
+   struct dpbp_cmd_set_irq *cmd_params;
 
/* prepare command */
cmd.header = mc_encode_cmd_header(DPBP_CMDID_SET_IRQ,
  cmd_flags, token);
-   cmd.params[0] |= mc_enc(0, 8, irq_index);
-   cmd.params[0] |= mc_enc(32, 32, irq_cfg->val);
-   cmd.params[1] |= mc_enc(0, 64, irq_cfg->addr);
-   cmd.params[2] |= mc_enc(0, 32, irq_cfg->irq_num);
+   cmd_params = (struct dpbp_cmd_set_irq *)cmd.params;
+   cmd_params->irq_index = irq_index;
+   cmd_params->irq_val = cpu_to_le32(irq_cfg->val);
+   cmd_params->irq_addr = cpu_to_le64(irq_cfg->addr);
+   cmd_params->irq_num = cpu_to_le32(irq_cfg->irq_num);
 
/* send command to mc*/
return mc_send_command(mc_io, );
@@ -319,12 +325,15 @@ int dpbp_get_irq(struct fsl_mc_io *mc_io,
 struct dpbp_irq_cfg *irq_cfg)
 {
struct mc_command cmd = { 0 };
+   struct 

[PATCH 11/11] staging: fsl-mc: convert mc command build/parse to use C structs

2016-06-22 Thread Stuart Yoder
From: Ioana Radulescu 

The layer abstracting the building of commands and extracting
responses is currently based on macros that shift and mask the command
fields and requires exposing offset/size values as macro parameters
and makes the code harder to read.

For clarity and maintainability, instead use an implementation based on
mapping the MC command definitions to C structures. These structures
contain the hardware command fields (which are naturally-aligned)
and individual fields are little-endian ordering (the byte ordering
of the hardware).

As such, there is no need to perform the conversion between core and
hardware (LE) endianness in mc_send_command(), but instead each
individual field in a command will be converted separately if needed
by the function building the command or extracting the response.

This patch does not introduce functional changes, both the hardware
ABIs and the APIs exposed for the DPAA2 objects remain the same.

Signed-off-by: Ioana Radulescu 
Signed-off-by: Stuart Yoder 
---
 drivers/staging/fsl-mc/bus/dpbp.c | 132 --
 drivers/staging/fsl-mc/bus/dpmcp-cmd.h|  86 +++-
 drivers/staging/fsl-mc/bus/dpmcp.c|  89 ++--
 drivers/staging/fsl-mc/bus/dpmng-cmd.h|  12 +-
 drivers/staging/fsl-mc/bus/dpmng.c|  14 +-
 drivers/staging/fsl-mc/bus/dprc-cmd.h | 379 +++-
 drivers/staging/fsl-mc/bus/dprc.c | 715 ++
 drivers/staging/fsl-mc/bus/mc-sys.c   |  46 +-
 drivers/staging/fsl-mc/include/dpbp-cmd.h | 125 +-
 drivers/staging/fsl-mc/include/mc-cmd.h   |  91 ++--
 10 files changed, 1056 insertions(+), 633 deletions(-)

diff --git a/drivers/staging/fsl-mc/bus/dpbp.c 
b/drivers/staging/fsl-mc/bus/dpbp.c
index c31fe1b..fe271fb 100644
--- a/drivers/staging/fsl-mc/bus/dpbp.c
+++ b/drivers/staging/fsl-mc/bus/dpbp.c
@@ -1,4 +1,4 @@
-/* Copyright 2013-2014 Freescale Semiconductor Inc.
+/* Copyright 2013-2016 Freescale Semiconductor Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
@@ -57,12 +57,14 @@ int dpbp_open(struct fsl_mc_io *mc_io,
  u16 *token)
 {
struct mc_command cmd = { 0 };
+   struct dpbp_cmd_open *cmd_params;
int err;
 
/* prepare command */
cmd.header = mc_encode_cmd_header(DPBP_CMDID_OPEN,
  cmd_flags, 0);
-   cmd.params[0] |= mc_enc(0, 32, dpbp_id);
+   cmd_params = (struct dpbp_cmd_open *)cmd.params;
+   cmd_params->dpbp_id = cpu_to_le32(dpbp_id);
 
/* send command to mc*/
err = mc_send_command(mc_io, );
@@ -70,7 +72,7 @@ int dpbp_open(struct fsl_mc_io *mc_io,
return err;
 
/* retrieve response parameters */
-   *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+   *token = mc_cmd_hdr_read_token();
 
return err;
 }
@@ -143,7 +145,7 @@ int dpbp_create(struct fsl_mc_io *mc_io,
return err;
 
/* retrieve response parameters */
-   *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+   *token = mc_cmd_hdr_read_token();
 
return 0;
 }
@@ -231,6 +233,7 @@ int dpbp_is_enabled(struct fsl_mc_io *mc_io,
int *en)
 {
struct mc_command cmd = { 0 };
+   struct dpbp_rsp_is_enabled *rsp_params;
int err;
/* prepare command */
cmd.header = mc_encode_cmd_header(DPBP_CMDID_IS_ENABLED, cmd_flags,
@@ -242,7 +245,8 @@ int dpbp_is_enabled(struct fsl_mc_io *mc_io,
return err;
 
/* retrieve response parameters */
-   *en = (int)mc_dec(cmd.params[0], 0, 1);
+   rsp_params = (struct dpbp_rsp_is_enabled *)cmd.params;
+   *en = rsp_params->enabled & DPBP_ENABLE;
 
return 0;
 }
@@ -286,14 +290,16 @@ int dpbp_set_irq(struct fsl_mc_io *mc_io,
 struct dpbp_irq_cfg *irq_cfg)
 {
struct mc_command cmd = { 0 };
+   struct dpbp_cmd_set_irq *cmd_params;
 
/* prepare command */
cmd.header = mc_encode_cmd_header(DPBP_CMDID_SET_IRQ,
  cmd_flags, token);
-   cmd.params[0] |= mc_enc(0, 8, irq_index);
-   cmd.params[0] |= mc_enc(32, 32, irq_cfg->val);
-   cmd.params[1] |= mc_enc(0, 64, irq_cfg->addr);
-   cmd.params[2] |= mc_enc(0, 32, irq_cfg->irq_num);
+   cmd_params = (struct dpbp_cmd_set_irq *)cmd.params;
+   cmd_params->irq_index = irq_index;
+   cmd_params->irq_val = cpu_to_le32(irq_cfg->val);
+   cmd_params->irq_addr = cpu_to_le64(irq_cfg->addr);
+   cmd_params->irq_num = cpu_to_le32(irq_cfg->irq_num);
 
/* send command to mc*/
return mc_send_command(mc_io, );
@@ -319,12 +325,15 @@ int dpbp_get_irq(struct fsl_mc_io *mc_io,
 struct dpbp_irq_cfg *irq_cfg)
 {
struct mc_command cmd = { 0 };
+   struct dpbp_cmd_get_irq *cmd_params;
+   struct dpbp_rsp_get_irq *rsp_params;
int