}
EXPORT_SYMBOL_GPL(fpga_mgr_firmware_load);
+int fpga_mgr_signature_load(struct fpga_manager *mgr,
+ const char *image_name)
+{
+ struct device *dev = &mgr->dev;
+ const struct firmware *fw;
+ int ret;
+
+ dev_info(dev, "Loading %s to %s\n", image_name, mgr->name);
+
+ ret = request_firmware(&fw, image_name, dev);
+ if (ret) {
+ dev_err(dev, "Error requesting firmware %s\n", image_name);
+ return ret;
+ }
+
+ memcpy(mgr->signature, fw->data, fw->size);
+
+ release_firmware(fw);
+
+ return ret;
+}
+
+int fpga_mgr_pubkey_load(struct fpga_manager *mgr,
+ const char *image_name)
+{
+ struct device *dev = &mgr->dev;
+ const struct firmware *fw;
+ int ret;
+
+ dev_info(dev, "Loading %s to %s\n", image_name, mgr->name);
+
+ ret = request_firmware(&fw, image_name, dev);
+ if (ret) {
+ dev_err(dev, "Error requesting firmware %s\n", image_name);
+ return ret;
+ }
+
+ memcpy(mgr->pubkey, fw->data, fw->size);
+
+ release_firmware(fw);
+
+ return ret;
+}
+
static const char * const state_str[] = {
[FPGA_MGR_STATE_UNKNOWN] = "unknown",
[FPGA_MGR_STATE_POWER_OFF] = "power off",
return count;
}
+static ssize_t signature_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct fpga_manager *mgr = to_fpga_manager(dev);
+ unsigned int len;
+ char image_name[NAME_MAX];
+ int ret;
+
+ /* lose terminating \n */
+ strcpy(image_name, buf);
+ len = strlen(image_name);
+ if (image_name[len - 1] == '\n')
+ image_name[len - 1] = 0;
+
+ ret = fpga_mgr_signature_load(mgr, image_name);
+ if (ret)
+ return ret;
+
+ return count;
+}
+
+static ssize_t pubkey_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct fpga_manager *mgr = to_fpga_manager(dev);
+ unsigned int len;
+ char image_name[NAME_MAX];
+ int ret;
+
+ /* lose terminating \n */
+ strcpy(image_name, buf);
+ len = strlen(image_name);
+ if (image_name[len - 1] == '\n')
+ image_name[len - 1] = 0;
+
+ ret = fpga_mgr_pubkey_load(mgr, image_name);
+ if (ret)
+ return ret;
+
+ return count;
+}
+
static ssize_t key_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
static DEVICE_ATTR_RO(name);
static DEVICE_ATTR_RO(state);
static DEVICE_ATTR_WO(firmware);
+static DEVICE_ATTR_WO(signature);
+static DEVICE_ATTR_WO(pubkey);
static DEVICE_ATTR_RW(flags);
static DEVICE_ATTR_RW(key);
static DEVICE_ATTR_RW(iv);
&dev_attr_name.attr,
&dev_attr_state.attr,
&dev_attr_firmware.attr,
+ &dev_attr_signature.attr,
+ &dev_attr_pubkey.attr,
&dev_attr_flags.attr,
&dev_attr_key.attr,
&dev_attr_iv.attr,
/* Constant Definitions */
#define IXR_FPGA_DONE_MASK 0X00000008U
+#define IXR_FPGA_AUTHENTICATIN 0x00000004U
#define IXR_FPGA_ENCRYPTION_EN 0x00000008U
struct zynqmp_fpga_priv {
{
struct zynqmp_fpga_priv *priv;
char *kbuf;
- size_t dma_size;
+ size_t dma_size = size;
dma_addr_t dma_addr;
u32 transfer_length;
int ret;
priv = mgr->priv;
+ if (mgr->flags & IXR_FPGA_AUTHENTICATIN)
+ dma_size = dma_size + SIGNATURE_LEN + PUBLIC_KEY_LEN;
if (mgr->flags & IXR_FPGA_ENCRYPTION_EN)
- dma_size = size + ENCRYPTED_KEY_LEN + ENCRYPTED_IV_LEN;
- else
- dma_size = size;
+ dma_size = dma_size + ENCRYPTED_KEY_LEN + ENCRYPTED_IV_LEN;
kbuf = dma_alloc_coherent(priv->dev, dma_size, &dma_addr, GFP_KERNEL);
if (!kbuf)
memcpy(kbuf, buf, size);
+ if (mgr->flags & IXR_FPGA_AUTHENTICATIN) {
+ memcpy(kbuf + size, mgr->signature, SIGNATURE_LEN);
+ memcpy(kbuf + size + SIGNATURE_LEN, mgr->pubkey,
+ PUBLIC_KEY_LEN);
+ }
if (mgr->flags & IXR_FPGA_ENCRYPTION_EN) {
memcpy(kbuf + size, mgr->key, ENCRYPTED_KEY_LEN);
memcpy(kbuf + size + ENCRYPTED_KEY_LEN, mgr->iv,